# qwen_generator.py
from .qwen_client import call_qwen
from .knowledge_loader import load_local_knowledge



def generate_analysis(standard_fault, fault_details, fault_info, upstream_faults):
    """使用优化后的提示词生成严格格式的分析报告"""
    local_knowledge = load_local_knowledge()

    # 准备上下文信息
    context_info = {
        "fault_name": standard_fault,
        "description": fault_details.get('description', '无'),
        "root_cause": fault_info['root_cause']['description'],
        "dependencies": [f"{d['upstream_entity']}({d['dependency_desc']})"
                         for d in fault_info.get('dependencies', [])],
        "kg_solutions": fault_info.get('solutions_from_kg', ['无预定义解决方案']),
        "local_knowledge": local_knowledge[:1000] if local_knowledge else "无",
        # GraphRAG增强知识
        "enhanced_knowledge": fault_info.get("enhanced_knowledge", "无GraphRAG增强知识")
    }
    prompt = f"""
    # 任务说明
    你是一名资深运维专家，需要为故障「{context_info["fault_name"]}」生成专业的技术分析报告和解决方案。
    必须严格按照以下格式要求生成内容，任何偏差都将导致报告无效。
    ## 输入信息
    ### 故障基础信息
    - 故障名称：{context_info["fault_name"]}
    - 详细描述：{context_info["description"]}
    - 根本原因：{context_info["root_cause"]}
    - 上游依赖：{context_info["dependencies"]}
    - 已有解决方案：{" | ".join(context_info["kg_solutions"])}
    - 相关知识片段：{context_info["local_knowledge"]}
    # 新增：GraphRAG增强知识（需结合到分析和解决方案中）
    - 增强补充信息：{context_info["enhanced_knowledge"]}
    ## 输出要求
    ### 格式规范
    必须严格使用以下标记划分区块（区分大小写）：
    [AnalysisReport] [Solution1] [Code1] [Solution2] [Code2]

    ### 分析报告要求（[AnalysisReport]区块）
    1. 技术分析（200-300字）：
       - 根本原因：从系统架构、资源配置、代码逻辑等角度分析
       - 影响路径：说明故障如何影响系统各组件
       - 严重性评估：根据业务影响分级（Critical/Major/Minor）
    2. 必须包含加粗的故障名称标记：**{context_info["fault_name"]}**
    3. 必须引用相关知识片段中的关键信息

    ### 解决方案要求（[SolutionX]区块）
    每种解决方案必须包含：
    1. 解决思路（50-100字）
    2. 实施步骤（分条目列出，至少3步）
    3. 验证方法（如何确认问题已解决）
    4. 回滚方案（出现意外时的应急措施）

    ### 代码要求（[CodeX]区块）
    1. 必须是完整可执行的Bash脚本
    2. 包含详细的注释说明（每行命令上方注释）
    3. 包含错误处理逻辑（set -euo pipefail）
    4. 包含日志记录功能（重要操作记录到/var/log）
    5. 必须包含#!/bin/bash声明

    ## 输出模板
    [AnalysisReport]
    当前系统故障为 **{context_info["fault_name"]}**，技术分析如下：
    - 根本原因：[详细技术分析，200-300字]
    - 影响路径：[受影响组件及影响方式]
    - 严重性：[Critical/Major/Minor]级

    [Solution1]
    1. 解决思路：[50-100字说明,可参考GraphRAG增强知识中的方案]
    2. 实施步骤：
       1. [步骤1详细说明]
       2. [步骤2详细说明]
       3. [步骤3详细说明]
    3. 验证方法：[如何验证解决方案有效]
    4. 回滚方案：[出现问题时如何快速恢复]

    [Code1]
    ```bash
    #!/bin/bash
    set -euo pipefail
    LOG_FILE="/var/log/fix_{context_info["fault_name"].lower().replace(' ', '_')}.log"

    # 步骤1: [操作目的]
    [命令1]

    # 步骤2: [操作目的] 
    [命令2]
    ```

    [Solution2]
    [同Solution1格式]

    [Code2]
    [同Code1格式]

    ## 质量检查清单
    1. 是否包含所有必需区块？
    2. 技术分析是否达到字数要求？
    3. 解决方案是否有完整的实施步骤？
    4. 脚本是否包含错误处理和日志记录？
    5. 是否引用了相关知识片段？

    请严格按照上述要求生成内容，不要添加任何解释性文字。
    """

    messages = [{"role": "user", "content": prompt}]
    generated_content = call_qwen(messages)

    if generated_content is None:
        return "❌ 模型调用失败"

    # 标准化区块标记
    processed_content = (
        generated_content
        .replace("【", "[")
        .replace("】", "]")
        .replace("[分析报告]", "[AnalysisReport]")
        .replace("[解决方案1]", "[Solution1]")
        .replace("[方案1代码]", "[Code1]")
        .replace("[解决方案2]", "[Solution2]")
        .replace("[方案2代码]", "[Code2]")
    )

    # 验证必需区块
    required_sections = [
        "[AnalysisReport]",
        "[Solution1]",
        "[Code1]",
        "[Solution2]",
        "[Code2]"
    ]
    if not all(section in processed_content for section in required_sections):
        return "❌ 响应格式不符合要求：缺少必需区块"

    # 验证故障名称标记
    if f"**{context_info['fault_name']}**" not in processed_content:
        return "❌ 响应格式不符合要求：未包含加粗的故障名称"

    return processed_content